package com.wy.Reflex;

/**
 * @author 吴宇~
 * @motto 我亦无他，唯手熟尔。
 * @edition jdk1.8
 * @reflection 0-1 喧闹任其喧闹，自由我自为之，我自风情万种，与世无争。
 * @date 2023/07/20/16:02
 * @target 心若有所向往，何惧道阻且长
 */

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * 回忆一下反射的机制，
 * 需要反射的类一定要有一个无参构造的方法
 * 一个类只会有一个class对象在堆里。这个类的对象里面包含了完整的类的信息。class对象就相当于
 */

public class Reflex {
    public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\testReflex\\test.properties"));
        String className = properties.get("classPath").toString();
        String methodName = properties.get("method").toString();
        System.out.println("className=" +className);
        System.out.println("methodName=" +methodName);

//        通过路径加载类
        Class  aClass = Class.forName(className);
//        通过cls得到加载的类，  test_Cat的实例对象，
        Object o = aClass.newInstance();
        System.out.println(o);
        testCat cat = (testCat) o;
        cat.setAge(10);
        cat.setName("123");
        System.out.println(cat);

//        通过方法对象调用方法，这个调用不太的一样，是使用方法
        Method method = aClass.getMethod(methodName);//使用方法调用invoke，传入对象作为参数进而实现调用。
        Object invoke = method.invoke(o);
        Field name = aClass.getField("name");
        System.out.println(name.get(cat));
        Constructor constructor = aClass.getConstructor(String.class,int.class);
        System.out.println(constructor);
        testCat wy = (testCat)constructor.newInstance("吴宇", 12);
        String name1 = wy.getName();
        System.out.println(name1);
        System.out.println(wy.toString());
    }
}
